package com.cskaoyan.javase.oop.statickeyword7.basic2;

/**
 * @description: 通过案例去深入理解static
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

/**
 * 接下来我们通过一个案例来深入了解static关键字
 *
 * 宠物公司新进了一批同样颜色的宠物，创建一个类描述这批宠物
 * - 属性：颜色，性别
 * - 行为：（static）跑，跳
 *
 * 不推荐使用对象名访问，因为如果使用对象名就好像这个成员是属于对象的了，实际上并不是
 * 根据这种所属不同，属于类，所以有些书籍和博客，它会给一个名字
 * 静态成员变量：类成员变量，类方法，类属性，类行为 = "静态xxx"
 * 不推荐这种叫法，只要知道即可，静态是约定俗称的叫法
 *
 * 为啥叫静态？它哪里安静了？
 * static关键字的由来：
 * 最早是C语言发明，C语言用这个关键字用来表示一个在方法外部也可以使用的局部变量
 * 然后C++把这个关键字抄来了，但是完全改变了这个关键字的意义，变成属于类的，而不是某个对象的成员（和Java是一样的）
 * Java又把c++的东西超来了
 * 所以这个关键字，纯粹属于程序员偷懒的结果，这个时候static关键字早就没有最早的意义
 * 马路，是马在跑？
 * 汽车
 *
 *
 */

public class Demo {
    //这个main方法是Demo类的main方法，会触发Demo类加载
    public static void main(String[] args) {
        ////创建兔子对象
        Rabbit r = new Rabbit();
        ////通过对象去访问静态成员变量
        ////Static member 'com.cskaoyan.javase.oop.statickeyword7.basic2.Rabbit.color' accessed via instance reference
        ////静态成员被一个实例对象去访问了
        System.out.println(r.color);
        //静态成员的正确访问姿势：不是通过对象，而是通过类名
        System.out.println(Rabbit.color);
        Rabbit.color = '黑';
        System.out.println(r.color);
        r.run();


    }
}
//定义一个兔子类
class Rabbit{
    //定义属性
    static char color = '白';
    String gender;

    //定义行为
    public static void run(){
        System.out.println("和乌龟一起跑！");
    }
    public void jump(){
        System.out.println("蹦蹦跳跳真可爱，味道不错！");
    }

    //构造方法的语法是死的 不能有任何变化 public这里可以变 访问权限修饰
    public Rabbit(String gender) {
        this.gender = gender;
    }

    public Rabbit() {
    }
}

